package com.coincalf.service;

import com.coincalf.dto.PositionSummaryDTO;
import com.coincalf.entity.ForexAccount;
import com.baomidou.mybatisplus.service.IService;
import com.coincalf.entity.ForexOpenPositionOrder;
import com.coincalf.entity.Market;
import com.coincalf.framework.dto.ForexMarketDTO;
import com.coincalf.framework.enums.OrderType;
import com.coincalf.framework.enums.TradeType;
import com.coincalf.framework.exception.ForexAccountException;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 创新交易持仓信息 服务类
 * </p>
 *
 * @author qiang
 * @since 2018-05-12
 */
public interface ForexAccountService extends IService<ForexAccount> {

    /**
     * 查询持仓账户
     *
     * @param marketId  交易对ID
     * @param userId    用户ID
     * @param orderType 持仓方向
     * @return
     */
    ForexAccount queryByUserAndMarketAndType(long marketId, long userId, OrderType orderType);

    /**
     * 冻结持仓
     *
     * @param accountId 持仓账户ID
     * @param volume    冻结金额
     * @param tradeType 交易类型
     * @param remark    备注
     * @return
     * @throws ForexAccountException
     */
    boolean lockAmount(long accountId,
                       BigDecimal volume,
                       TradeType tradeType,
                       String remark) throws ForexAccountException;

    /**
     * 解冻持仓
     *
     * @param accountId 持仓账户ID
     * @param volume    冻结金额
     * @param tradeType 交易类型
     * @param remark    备注
     * @return
     * @throws ForexAccountException
     */
    boolean unlockAmount(long accountId,
                         BigDecimal volume,
                         TradeType tradeType,
                         String remark) throws ForexAccountException;

    /**
     * 持仓汇总
     *
     * @param userId 用户ID
     * @return
     */
    List<PositionSummaryDTO> positionSummary(Long userId);

    /**
     * 浮动盈亏计算
     * 多头持仓：（买一价 - 持仓买入价） * 合约单位 * 报价货币兑（USDT或BTC） * 手数
     * 空头持仓：（持仓卖出价 - 卖一价）  * 合约单位 * 报价货币兑（USDT或BTC） * 手数
     *
     * @param forexOpenPositionOrder
     * @param market
     * @param forexMarket
     * @return
     */
    BigDecimal calculateProfit(ForexOpenPositionOrder forexOpenPositionOrder, Market market, ForexMarketDTO forexMarket);
}
